package dao

import (
	"Wechat/Tools"
	"Wechat/domain"
	"errors"
	"fmt"
	"gorm.io/gorm"
)

// 自定义UserMapper类型，用于调用UserInfo的专属函数
type UserMapper string

// 从从数据库连接池中获取一个连接
func getDataBaseConnect() *gorm.DB {
	return Tools.GetDB()
}

// 获取数据库连接
var userInfoDB *gorm.DB = getDataBaseConnect()

// 插入名字、密码、用户角色等必填信息并且返回插入成功条数
/*func (u UserMapper) InsertPrimaryMessage(userID string, userPassword string, userIdentity string, unionID string) int64 {
	fmt.Println("This is InsertPrimaryMessage")
	// 给结构体输入数据
	user := domain.User{
		UserID:       userID,
		UserPassword: userPassword,
		UserIdentity: userIdentity,
		UnionID:      unionID,
	}
	// 插入指定字段的值
	result := userInfoDB.Select("UserID", "UserPassword", "UserIdentity", "UnionID").Create(&user)
	Tools.CherrError(result.Error, "Insert primary message ERROR!")
	return result.RowsAffected
}*/

// 插入必填信息：名字、密码、用户角色等必填角色并且返回成功插入条数
func (u UserMapper) InsertPrimaryMessage(user domain.User) int64 {
	//	 插入指定字段的值
	result := userInfoDB.Select("UserID", "UserPassword", "UserIdentity", "UnionID").Create(&user)
	Tools.CherrError(result.Error, "Insert primary message ERROR!")
	return result.RowsAffected
}

/*// 根据union修改信息
func (u UserMapper) ModifyByUnionID(name, nickName, headPicPath, grade, school, union string) int64 {
	// 新建Map，将所有的需要插入的信息放进去
	var userMap = make(map[string]interface{})
	userMap["name"] = name
	userMap["nickName"] = nickName
	userMap["headPicPath"] = headPicPath
	userMap["grade"] = grade
	userMap["school"] = school
	// 根据指定条件插入信息到数据库
	result := userInfoDB.Table("userinfo").Where("unionID = ?", union).Updates(userMap)
	Tools.CherrError(result.Error, "Insert another message ERROR!")
	// 返回收到影响的行数
	return result.RowsAffected
}*/

// 根据union修改信息
func (u UserMapper) ModifyByUnionID(user domain.User) int64 {
	//	直接把需要更新的信息放进去
	result := userInfoDB.Table("userinfo").Where("unionID = ?", user.UnionID).Updates(&user)
	Tools.CherrError(result.Error, "Insert another message ERROR!")
	return result.RowsAffected
}

// 通过账号密码查询记录
func (u UserMapper) SelectByUserIDPassword(userID string, userPassword string) domain.User {
	//	给结构体输入数据
	user := domain.User{}
	//	在数据库中搜索数据
	result := userInfoDB.Find(&user, "userID = ? AND userPassword = ?", userID, userPassword)
	// 检查是不是找不到
	if errors.Is(result.Error, gorm.ErrRecordNotFound) {
		fmt.Println("查询不到数据，账号是：", userID, "	密码是：", userPassword)
		// 找不到就返回一个空的User
		return domain.User{}
	} else if result.Error != nil {
		// 如果不为空但是错误不是找不到，说明出现了其他的错误，打印错误信息
		Tools.CherrError(result.Error, "Select by userID and userPassword ERROR!")
	}
	// 返回找到的记录User
	return user
}

// 通过UnionID查询数据
func (u UserMapper) SelectByUnionID(unionID string) domain.User {
	//	通过user存储得到的数据
	user := domain.User{}
	//	在数据库中寻找数据
	result := userInfoDB.Find(&user, "unionID = ?", unionID)
	if errors.Is(result.Error, gorm.ErrRecordNotFound) {
		fmt.Println("查询不到数据，unionID为：", unionID)
		//	找不到数据就返回一个空
		return domain.User{}
	} else if result.Error != nil {
		Tools.CherrError(result.Error, "Select by unionID ERROR!")
		return domain.User{}
	}
	fmt.Println(user)
	return user
}

// 修改密码
func (u UserMapper) ModifyPassword(union, password string) int64 {
	user := domain.User{}
	result := userInfoDB.Table("userinfo").Where("unionID = ?", union).Find(&user)
	Tools.CherrError(result.Error, "Modify password ERROR!")
	// 如果密码重复则不需要修改，返回-1
	if user.UserPassword == password {
		return -1
	}
	result = userInfoDB.Table("userinfo").Where("unionID = ?", union).Update("userPassword", password)
	Tools.CherrError(result.Error, "Modify password ERROR!")
	// 返回影响的行数
	return result.RowsAffected
}
